package com.yao.common.helper;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.IdcardUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import com.yao.common.enums.SysErrorEnum;
import com.yao.common.exception.BusinessException;

import java.util.List;

/**
 * 
 * 参数校验辅助类
 * 
 * @author liaohongjian
 *
 * @since 2017年6月9日
 *
 * @version 1.0
 */
public class ValidateHelper {

    /**
     * 通用非空参数校验
     * 
     * @return 返回校验信息
     */
    public static void validateNull(Object bean, String[] propertyNames) {
        StringBuffer errorMessage = new StringBuffer();

        if (bean == null) {
            throw new BusinessException(SysErrorEnum.PARAMETER_ERROR);
        }

        // 不需要校验参数
        if (propertyNames == null || propertyNames.length == 0) {
            return;
        }

        for (String name : propertyNames) {
            Object value = ReflectUtil.getFieldValue(bean, name);

            if (ObjectUtil.isEmpty(value)) {
                errorMessage.append("[").append(name).append("]不能为空;");
            }
        }

        if (errorMessage.length() > 0) {
            throw new BusinessException(SysErrorEnum.PARAMETER_ERROR.getErrCode(), errorMessage.toString());
        }
    }

    /**
     * 通用非空参数校验
     * 
     * @return 返回校验信息
     */
    public static void validateNull(JSONObject bean, String[] propertyNames) {
        StringBuffer errorMessage = new StringBuffer();

        if (bean == null) {
            throw new BusinessException(SysErrorEnum.PARAMETER_ERROR);
        }

        // 不需要校验参数
        if (propertyNames == null || propertyNames.length == 0) {
            return;
        }

        for (String name : propertyNames) {
            Object value = bean.get(name);

            if (ObjectUtil.isEmpty(value)) {
                errorMessage.append("[").append(name).append("]不能为空;");
            }
        }

        if (errorMessage.length() > 0) {
            throw new BusinessException(SysErrorEnum.PARAMETER_ERROR.getErrCode(), errorMessage.toString());
        }
    }

    /**
     * 校验列表
     * 
     * @author liaohongjian
     * @since 2017年8月14日
     * @param beanList
     * @param properties
     */
    public static void validateNullList(List<?> beanList, String[] properties) {
        if (CollUtil.isEmpty(beanList)) {

            throw new BusinessException(SysErrorEnum.PARAMETER_ERROR);
        }

        for (Object bean : beanList) {
            validateNull(bean, properties);
        }
    }

    /**
     * 校验列表
     * 
     * @author liaohongjian
     * @since 2017年8月14日
     * @param properties
     */
    public static void validateNullList(JSONArray jsonArray, String[] properties) {
        if (CollUtil.isEmpty(jsonArray)) {
            throw new BusinessException(SysErrorEnum.PARAMETER_ERROR);
        }

        for (int i = 0; i < jsonArray.size(); i++) {
            validateNull(jsonArray.getJSONObject(i), properties);
        }
    }

    public static void validateId(Integer id) {
        if (null == id) {
            throw new BusinessException(SysErrorEnum.PARAMETER_ERROR.getErrCode(), "请求参数[id]不能为空.");
        }
    }

    public static void validateStr(String str) {
        if (null == str) {
            throw new BusinessException(SysErrorEnum.PARAMETER_ERROR.getErrCode(), "请求字符串不能为空.");
        }
    }

    public static void validateIdCard(String idCard) {

        if (StrUtil.isEmpty(idCard)) {
            throw new BusinessException(SysErrorEnum.PARAMETER_ERROR.getErrCode(), "校验身份证号码不能为空.");
        }

        if (!IdcardUtil.isValidCard(idCard)) {
            throw new BusinessException(SysErrorEnum.PARAMETER_ERROR.getErrCode(), "身份证号格式不正确. idCard = {}", idCard);
        }

    }

    public static void validateNullStr(String str) {
        if (StrUtil.isEmpty(str)) {
            throw new BusinessException(SysErrorEnum.PARAMETER_ERROR, "字符串不能为空");
        }
    }

}
